package java8;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author lzy
 * Create DateTime: 2018/7/18 21:08
 * @version v1.0
 * <p>
 * 一、方法引用：若Lambda体中的内容方法已经实现了，我们可以使用"方法引用"，可以理解为方法引用是Lambda表达式的另外一种表现形式
 * 主要有三种语法格式：
 * <p>
 * 1. 对象：：实例方法名
 * 2. 类：：静态方法名
 * 3. 类：：实例方法名（当lambda表达式第一个参数是实例方法的调用者，第二个参数是实例方法的参数时，可以使用该种形式）
 * <p>
 * 注意：
 * 1. lambda体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的参数列表和返回值类型保持一致
 * 2. 若Lambda参数列表中的第一个参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName::method
 * <p>
 * 二、构造器引用
 * 格式：
 * ClassName::new
 * <p>
 * 注意：需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表一致
 * <p>
 * 三、数组引用
 * <p>
 * Type[]::new;
 */
public class TestMethodRef {
    @Test
    public void test1() {
        Consumer<String> con = System.out::println;
        con.accept("abck");
    }

    @Test
    public void test2() {
        Employee emp = new Employee();
        Supplier<String> sup = emp::getName;
        String str = sup.get();
        System.out.println(str);
    }

    @Test
    public void test3() {
        Comparator<Integer> com = Integer::compareTo;
        System.out.println(com.compare(3, 2));
    }

    @Test
    public void test4() {
        BiPredicate<String, String> bp = String::equals;
        System.out.println(bp.test("a", "b"));
    }

    @Test
    public void test5() {
        Supplier<Employee> sup = Employee::new;
        Employee emp = sup.get();
    }

    @Test
    public void test6() {
        Function<Integer, String[]> fun = String[]::new;
        String[] strs = fun.apply(20);
        System.out.println(strs.length);
    }
}
